﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
using System.ServiceModel;
using System.ServiceModel.Description;

using PEMS.Common;


namespace PEMS.Client
{
    public sealed class ClientController
    {
        private PemsService.PemsServiceClient _pemsClient;
        public N_1 kliensID { get; set; }
        private static ClientController _instance = null;
        private static readonly Object _lock = new Object();
        private bool _timer_seged=true;

        public static ClientController instance
        {
            get
            { 
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new ClientController();
                    }
                }
                return _instance;
            }
        }



        /// <summary>
        /// Konstruktor
        /// </summary>
        private ClientController()
        {
            Log.logToFile("ClientController created!",false);

            kliensID = new N_1();
            kliensID.bools.Add("belepve",false);
            kliensID.strings.Add("id","");
            kliensID.strings.Add("jelszo","");
            kliensID.strings.Add("userNev","");
            kliensID.strings.Add("ip","");
        }

        /// <summary>
        /// a ping küldése, az eredménnyel visszatér
        /// ez azért kell, hogy a session élve maradjon
        /// </summary>
        public bool ping()
        {
            bool ret=true;
            try
            {
                _pemsClient.ping();
            }
            catch
            {
                reset();
                if (_timer_seged)
                {
                    _timer_seged = false;
                }
                ret = false;
            }
            return ret;
        }

        /// <summary>
        /// Vizsgára akar jelentkezni a hallgató
        /// ehhez meg kell adni a félévet, a kurzust és a vizsgaidőpontot
        /// </summary>
        public N_1 VizsgaIdopontraFeliratkozas(string felev, string kurzusid, string vidopontID)
        {

            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            komm.strings.Add("kurzusID", kurzusid);
            komm.strings.Add("vizsgaIdopontID", vidopontID);

            return _pemsClient.VizsgaIdopontraFeliratkozas(komm);
        }

        /// <summary>
        /// Félévek megjelenítése / összes illetve azon félévek listája ami(k)re beiratkozás történhet
        /// </summary>
        public N_1 getFelevList(bool aktualis)
        {
            N_1 komm = new N_1();
            komm.bools.Add("aktualis", aktualis);
            return _pemsClient.getFelevList(komm);
        }

        /// <summary>
        /// Felvehető vizsgákat akar látni a hallgató
        /// ehhez meg kell adni a félévet
        /// </summary>
        public N_1 getKurzusVizsgaIdopontList(string felev, string kurzusid)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev",felev);
            komm.strings.Add("kurzus", kurzusid);
            return _pemsClient.getKurzusVizsgaIdopontList(komm);
        }
            
        /// <summary>
        /// Felvehető kurzusokat akar látni a hallgató
        /// ehhez meg kell adni a félévet
        /// </summary>
        public N_1 getKurzusList(string felev)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            return _pemsClient.getKurzusList(komm);
        }

        /// <summary>
        /// egy félév egy kurzusára akar felriratkozni egy hallgató
        /// ehhez meg kell adni a félév id-t és a kurzus id-t
        /// </summary>
        public N_1 KurzusraFeliratkozik(string felev, string kurzusid)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            komm.strings.Add("kurzusID", kurzusid);
            return _pemsClient.KurzusraFeliratkozik(komm);
        }

        /// <summary>
        /// félévre akar beiratkozni a hallgató
        /// ehhez meg kell adni a félév id-t és a hallgató id-t
        /// </summary>
        public N_1 BeiratkozasFelevre(string felev, string hallgato)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            komm.strings.Add("hallgato", hallgato);
            return _pemsClient.BeiratkozasFelevre(komm);
        }


        /// <summary>
        /// lekérdezi, hogy a hallgató felvette-e a kérdéses félévet
        /// ehhez meg kell adni a hallgatót és a félévet
        /// </summary>
        public N_1 getFelevFelveve(string felev, string hallgato)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            komm.strings.Add("hallgato", hallgato);
            komm.bools.Add("beiratkozott", false);
            komm.bools.Add("hiba", false);
            return _pemsClient.getFelevFelveve(komm);
        }

        /// <summary>
        /// lekérdezi, hogy a hallgató felvette-e a kérdéses kurzust
        /// ehhez meg kell adni a hallgatót és a félévet és a kurzust
        /// </summary>
        public N_1 getKurzusFelveve(string felev, string kurzus, string hallgato)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            komm.strings.Add("kurzus", kurzus);
            komm.strings.Add("hallgato", hallgato);
            komm.bools.Add("felvette", false);
            komm.bools.Add("hiba", false);
            return _pemsClient.getKurzusFelveve(komm);
        }
        
        /// <summary>
        /// lekérdezi, hogy a hallgató felvette-e a kérdéses kurzust
        /// ehhez meg kell adni a hallgatót és a félévet és a kurzust
        /// </summary>
        public N_1 getAlairasBeallitva(string felev, string kurzus, string hallgato)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            komm.strings.Add("kurzus", kurzus);
            komm.strings.Add("hallgato", hallgato);
            komm.bools.Add("alairva", false);
            komm.bools.Add("hiba", false);
            return _pemsClient.getAlairasBeallitva(komm);
        }
        
        /// <summary>
        /// információk a felvett félévekről
        /// ehhez meg kell adni a hallgatót
        /// </summary>
        public N_1 getFelevInfo(string hallgato)
        {
            N_1 komm = new N_1();
            komm.strings.Add("hallgato", hallgato);
            return _pemsClient.getFelevInfo(komm);
        }        

        // <summary>
        /// a hálózat megnyitása
        /// </summary>
        public bool open()
        {
            _pemsClient = new PemsService.PemsServiceClient();

            _pemsClient.ClientCredentials.Windows.ClientCredential.UserName = Properties.Settings.Default.windowsServer_username;
            _pemsClient.ClientCredentials.Windows.ClientCredential.Password = Properties.Settings.Default.windowsServer_password;
            //_pemsClient.ClientCredentials.Windows.ClientCredential.Domain = "windowsdomain";
            try
            {
                _pemsClient.Open();
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine("\n\nException: " + e.Message);
                return false;
            }
        }

        /// <summary>
        /// kijelentkezés
        /// </summary>
        public void logoff()
        {
            reset();
            _pemsClient.stop();
        }

        /// <summary>
        /// bejelentkezés
        /// </summary>
        public bool logon(string u, string p){
            
            bool ret = false;
            
            kliensID.strings["userNev"] = u;
            kliensID.strings["jelszo"] = p;

            //elküldjük hálózaton és vissza is kapjuk
            kliensID = _pemsClient.auth(kliensID);

            if (kliensID.bools["belepve"])
            {
                _timer_seged = true;
                ret = true;
            }
            else
                _pemsClient.stop();
            
            return ret;
        }

        /// <summary>
        /// a bejelentkezéshez szükséges dolgok nullázása
        /// </summary>
        private void reset(){
            kliensID.bools["belepve"] = false;
            kliensID.strings["id"] = "";
            kliensID.strings["jelszo"] = "";
            kliensID.strings["userNev"] = "";
            kliensID.strings["ip"] = "";
        }

        /// <summary>
        /// Felvett kurzusok lekérdezése
        /// Félév és hallgató megadásával
        /// </summary>
        public N_1 getFelvettKurzus(string felev, string hallgato)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            komm.strings.Add("hallgato", hallgato);
            return _pemsClient.getFelvettKurzus(komm);
        }

        /// <summary>
        /// Felvett vizsgák lekérdezése
        /// Félév és hallgató megadásával
        /// </summary>
        public N_1 getFelvettVizsga(string felev, string hallgato)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            komm.strings.Add("hallgato", hallgato);
            return _pemsClient.getFelvettVizsga(komm);
        }

        /// <summary>
        /// vizsgajegy ellenőrzése
        /// </summary>
        public N_1 VizsgaJegyEllenorzes(string vfelev, string vkurzus, string vidopont, string vhallgato)
        {
            N_1 komm = new N_1();
            komm.strings.Add("vfelev", vfelev);
            komm.strings.Add("vkurzus", vkurzus);
            komm.strings.Add("vidopont", vidopont);
            komm.strings.Add("vhallgato", vhallgato);
            komm.bools.Add("vizsgaJegyAdhato", true);

            return _pemsClient.VizsgaJegyEllenorzes(komm);
        }

        /// <summary>
        /// vizsgajegy beírása
        /// </summary>
        public N_VizsgaJegyBeiras VizsgaJegyBeiras(string vfelev, string vkurzus, string vidopont, string vhallgato, ErdemjegyEnum vjegy)
        {
            N_VizsgaJegyBeiras komm = new N_VizsgaJegyBeiras();
            komm.strings.Add("vfelev", vfelev);
            komm.strings.Add("vkurzus", vkurzus);
            komm.strings.Add("vidopont", vidopont);
            komm.strings.Add("vhallgato", vhallgato);
            komm.vjegy = vjegy;

            return _pemsClient.VizsgaJegyBeiras(komm);
        }

        /// <summary>
        /// Vizsgaeredmények lekérdezése
        /// Hallgató megadásával
        /// </summary>
        public N_1 getVizsgaEredmenyek(string felev, string hallgato)
        {
            N_1 komm = new N_1();
            komm.strings.Add("felev", felev);
            komm.strings.Add("hallgato", hallgato);
            return _pemsClient.getVizsgaEredmenyek(komm);
        }

        /// <summary>
        /// aláírás beállítása
        /// </summary>
        public N_AlairasBeallitas AlairasBeallitas(string felev, string kurzus, string hallgato,AlairasEnum alairasErtek)
        {
            N_AlairasBeallitas komm = new N_AlairasBeallitas();
            komm.strings.Add("felev", felev);
            komm.strings.Add("kurzus", kurzus);
            komm.strings.Add("hallgato", hallgato);
            komm.alairasErtek = alairasErtek;


            return _pemsClient.AlairasBeallitas(komm);
        }
    }
}
